package RapiWeb;

import RapiWeb.Objeto.CampoBD;
import RapiWeb.Objeto.Tabla;
import RapiWeb.Objeto.Proyecto;
import Utilidades.Archivo;

public class Componente {

    private String str_NomComponente = "";
    private String str_Tipo = "";
    private String str_Tamaño = "";
    private String str_Nulo = "";
    private String str_Ordenar = "";
    private String str_campoBD = "";
    private String str_CodigoASPX = "";
    private String str_CodigoVB = "";
    private String str_Evento = "";
    private String str_Variable = "";
    private String str_Property = "";
    private String str_Metodo = "";
    private String str_Register = "";
    private String str_Validacion = "";
    private String[] str_Etiquetas;
    private static int int_Label = 1;
    private static int int_Boton = 2;
    private static int int_ComboBox = 3;
    private static int int_TextBox = 4;
    private static int int_CheckBox = 5;
    private static int int_ListBox = 6;
    private static int int_DataGridView = 7;
    private static int int_DropDonwList = 8;
    private Proyecto proyecto;
    private Archivo archivo;
    private Tabla tabla;

    public Componente() {
        str_Etiquetas = new String[]{"<CodigoASPX>", "<CodigoVB>", "<Evento>", "<Variable>", "<Metodo>", "<Property>", "<Register>"};
    }

    /* ***********************************************************************
     ***               Sección de Setters y Getters                        ***
     *************************************************************************/
    /**
     *
     * @return str_NomComponente
     */
    public String getStr_NomComponente() {
        return str_NomComponente;
    }

    public void setStr_NomComponente(String str_NomComponente) {
        this.str_NomComponente = str_NomComponente;
    }

    public String getStr_CodigoASPX() {
        return str_CodigoASPX;
    }

    public void setStr_CodigoASPX(String str_CodigoASPX) {
        this.str_CodigoASPX = str_CodigoASPX;
    }

    public String getStr_CodigoVB() {
        return str_CodigoVB;
    }

    public void setStr_CodigoVB(String str_CodigoVB) {
        this.str_CodigoVB = str_CodigoVB;
    }

    public String getStr_Evento() {
        return str_Evento;
    }

    public void setStr_Evento(String str_Evento) {
        this.str_Evento = str_Evento;
    }

    public String getStr_Property() {
        return str_Property;
    }

    public void setStr_Property(String str_Property) {
        this.str_Property = str_Property;
    }

    public String getStr_Metodo() {
        return str_Metodo;
    }

    public void setStr_Metodo(String str_Metodo) {
        this.str_Metodo = str_Metodo;
    }

    public String getStr_Tipo() {
        return str_Tipo;
    }

    public void setStr_Tipo(String str_Tipo) {
        this.str_Tipo = str_Tipo;
    }

    public String getStr_campoBD() {
        return str_campoBD;
    }

    public void setStr_campoBD(String str_campoBD) {
        this.str_campoBD = str_campoBD;
    }

    public String getStr_Variable() {
        return str_Variable;
    }

    public void setStr_Variable(String str_Variable) {
        this.str_Variable = str_Variable;
    }

    public String getStr_Register() {
        return str_Register;
    }

    public void setStr_Register(String str_Register) {
        this.str_Register = str_Register;
    }

    /* ***********************************************************************
     ***               Seccion de Metodos                                  ***
     *************************************************************************/
    /**
     * Metodo para asignar los datos del componente
     *
     * @param proyecto proyecto creado
     * @param str_Nombre nombre del componente para buscar el archivo
     * @param tabla tabla donde se obtienen los datos para un gridview
     * @param str_CampoBD nombre del campo de la base de datos que se le
     * asignara como nombre de componente
     */
    public void m_AsignarCodigo(Proyecto proyecto, String str_Nombre, Tabla tabla, CampoBD campo) {
        this.tabla = tabla;
//        str_campoBD = campo.getStr_NomCampo();
        str_campoBD = m_FormatoCampo(campo);
        try {
            this.proyecto = proyecto;
            archivo = new Archivo();
            archivo.m_LeerLineasConEtiquetas("Archivos/Componentes ASP/" + str_Nombre, str_Etiquetas);

            String columnas = m_ColumnasGridView();
            String columnasEtidables = m_ColumnasEditablesGridView();
            String arregloColumnas=m_ArregloColumnas();
            String actulizaColumnas=m_ActulizaColumnas();
            String obtenerFilas=m_ObtenerFilas();
            String verificarGridView=m_VerificarFilas();
            String str_NomCampo = m_FormatoCampo(campo);
            str_CodigoASPX = archivo.dameLinea(0);
            str_NomComponente = m_Prefijo(campo) + str_NomCampo;
            str_CodigoASPX = str_CodigoASPX.replace("?NomComponente", str_NomComponente);
            str_CodigoASPX = str_CodigoASPX.replace("?Tamano", campo.getStr_Tamaño());
            str_CodigoASPX = str_CodigoASPX.replace("?NomCampo", str_NomCampo);
            str_CodigoASPX = str_CodigoASPX.replace("?Columnas", columnas);
            str_CodigoASPX = str_CodigoASPX.replace("?EtidablesColumnas", columnasEtidables);
            str_CodigoVB = "" + archivo.dameLinea(1).replace("?NomComponente", str_NomComponente);
            str_Evento = "" + archivo.dameLinea(2).replace("?NomComponente", str_NomComponente);
            str_Evento = "" + str_Evento.replace("?NomCampo", str_NomCampo);
            str_Variable = "" + archivo.dameLinea(3).replace("?NomComponente", str_NomComponente);
            str_Metodo = "" + archivo.dameLinea(4).replace("?NomComponente", str_NomComponente);
            str_Metodo = str_Metodo.replace("?ArregloColumnas", arregloColumnas);
            str_Metodo = str_Metodo.replace("?ActulizaColumnas", actulizaColumnas);
            str_Metodo = str_Metodo.replace("?ObtenerFilas", obtenerFilas);
            str_Metodo = str_Metodo.replace("?VerificarGridView", verificarGridView);
            str_Property = "" + archivo.dameLinea(5).replace("?NomComponente", str_NomComponente);
            str_Property = "" + str_Property.replace("?NomCampo", str_NomCampo);
            str_Register = "" + archivo.dameLinea(6);

        } catch (Exception ex) {
            System.out.println("Exception en m_AsignarCodigo: " + ex.getMessage() + " : " + archivo.dameError());
        }
    }

    public String m_FormatoCampo(CampoBD campo) {
        String str_Nombre = campo.getStr_NomCampo();
        String letra = "" + str_Nombre.charAt(0);
        letra = letra.toUpperCase();
        str_Nombre = str_Nombre.replaceFirst("" + str_Nombre.charAt(0), letra);
        return str_Nombre;
    }

    public String m_Prefijo(CampoBD campo) {
        str_Validacion = "";
        String str_Prefijo = "";
        if (str_CodigoASPX.indexOf("TextBox") > 0) {
            str_Validacion = m_CrearValidacion(campo);
            str_Prefijo = proyecto.getStr_TextField();
        } else if (str_CodigoASPX.indexOf("DropDownList") > 0) {
            str_Prefijo = proyecto.getStr_ComboBox();
        } else if (str_CodigoASPX.indexOf("Grid") > 0) {
            str_Prefijo = proyecto.getStr_GridView();
        } else if (str_CodigoASPX.indexOf("Button") > 0) {
            str_Prefijo = proyecto.getStr_Button();
        } else if (str_CodigoASPX.indexOf("ListBox") > 0) {
            str_Prefijo = proyecto.getStr_ListBox();
        } else if (str_CodigoASPX.indexOf("CheckBox") > 0) {
            str_Prefijo = proyecto.getStr_CheckBox();
        } else if (str_CodigoASPX.indexOf("ComboBox") > 0) {
            str_Prefijo = proyecto.getStr_ComboBox();
        } else if (str_CodigoASPX.indexOf("Date") > 0) {
            str_Prefijo = proyecto.getStr_TextField();
        } else if (str_CodigoASPX.indexOf("WebNumericEdit") > 0) {
            str_Prefijo = proyecto.getStr_TextField();
        } else if (str_CodigoASPX.indexOf("Label") > 0) {
            str_Prefijo = proyecto.getStr_Label();
        } else {
            str_Prefijo = "inf";

        }
        str_Tipo = str_Prefijo;
        return str_Prefijo;
    }

    /**
     * Metodo para crear las columnas ASPX para el gridview
     *
     * @return str_Columnas
     */
    private String m_ColumnasGridView() {
        String str_Columnas = "";
        for (int i = 0; i < tabla.getCamposBD().length; i++) {
            String campo = tabla.getCamposBD()[i].getStr_NomCampo();
            str_Columnas += "<asp:BoundField DataField=\"" + campo + "\" HeaderText=\"" + campo + "\" />\n      ";
        }
        return str_Columnas;
    }

    /**
     * Metodo para crear las columnas editables (con textBox) ASPX para el
     * gridview
     *
     * @return str_Columnas
     */
    private String m_ColumnasEditablesGridView() {
        String str_Columnas = "";
        for (int i = 0; i < tabla.getCamposBD().length; i++) {
            String campo = tabla.getCamposBD()[i].getStr_NomCampo();
            str_Columnas += "<asp:TemplateField HeaderText=\"" + campo + "\" ConvertEmptyStringToNull=\"False\">\n      "
                    + "\t<ItemTemplate>\n      "
                    + "\t\t<asp:TextBox ID=\"txt" + campo + "\" runat=\"server\" SkinID=\"TextBoxCampo\" MaxLength=\"" + tabla.getCamposBD()[i].getStr_Tamaño() + "\" />\n      "
                    + "\t</ItemTemplate>\n      "
                    + "</asp:TemplateField>\n      ";
        }
        return str_Columnas;
    }

    private String m_CrearValidacion(CampoBD campo) {
        String str_Valida = "";
        if ("NO".equals(campo.getStr_Nulo())) {
            str_Valida = "If Me." + str_NomComponente + ".Text.Length = 0 Then\n"
                    + "  str_Mensaje += \"- " + campo.getStr_NomCampo() + " -\" + Chr(13)\n"
                    + "End If\n";
        }
        return str_Valida;
    }

    /**
     * Metodo para crear el arreglo de nombre de columnas para gridview
     * @return str_Columnas
     */
    private String m_ArregloColumnas() {
        String str_Columnas = "";
        for (int i = 0; i < tabla.getCamposBD().length; i++) {
            String campo = tabla.getCamposBD()[i].getStr_NomCampo();
            str_Columnas += "str_NomColumnas("+i+") = \""+campo+"\"\n\t";
        }
        return str_Columnas;
    }

    /**
     * 
     * @return 
     */
    private String m_ActulizaColumnas() {
        String str_Columnas = "";
        for (int i = 0; i < tabla.getCamposBD().length; i++) {
            String campo = tabla.getCamposBD()[i].getStr_NomCampo();
            str_Columnas += "CType(gdvDatos.Rows(i).Cells("+i+").FindControl(\"txt"+campo+"\"), TextBox).Text = tablaDatos.Rows(i)(\""+campo+"\")\n\t";
        }
        return str_Columnas;
    }
    
    /**
     * 
     * @return 
     */
    private String m_ObtenerFilas() {
        String str_Columnas = "";
        for (int i = 0; i < tabla.getCamposBD().length; i++) {
            String campo = tabla.getCamposBD()[i].getStr_NomCampo();
            str_Columnas += "NuevaFila(\""+campo+"\") = CType(gdvDatos.Rows(i).Cells("+i+").FindControl(\"txt"+campo+"\"), TextBox).Text\n\t";
        }
        return str_Columnas;
    }
    
    /**
     * 
     * @return str_Filas
     */
    private String m_VerificarFilas() {
        String str_Filas = "";
        for (int i = 0; i < tabla.getCamposBD().length; i++) {
            String campo = tabla.getCamposBD()[i].getStr_NomCampo();
            str_Filas +="str_Mensaje += validar.ValidaCampo(CType(gdvDatos.Rows(i).Cells("+i+").FindControl(\"txt"+campo+"\"), TextBox), \""+campo+"\")\n\t";
        }
        return str_Filas;
    }
    
}
